package com.study.dataStructure.generic;

import java.util.ArrayList;

/**
 * @PACKAGE_NAME: com.study.dataStructure.generic
 * @CLASS_NAME: GenericStack
 * @USER: kagura
 * @Description TODO 定义泛型类和接口，当使用类来创建对象或者使用类或接口来声明引用变量时必须制定具体的类型
 * @Date 2021/1/31 3:47 下午
 * @MONTH_NAME_FULL: 一月
 * @DAY: 31
 * @DAY_NAME_FULL: 星期日
 * @PROJECT_NAME: Study
 **/
public class GenericStack<E> {

    // 创建一个数组列表，用于存储元素
    ArrayList<E> list = new ArrayList<>();

    // 返回栈中的元素个数
    public int getSize() {
        return list.size();
    }

    // 返回栈顶元素
    public E peek() {
        return list.get(getSize() -1);
    }

    // 添加一个新元素到栈顶
    public void push(E o) {
        list.add(o);
    }

    // 返回并移除栈顶元素
    public E pop() {
        E o = list.get(getSize() - 1);
        list.remove(getSize() - 1);
        return o;
    }

    // 如果栈为空，则返回true
    public boolean isEmpty() {
        return list.isEmpty();
    }

    @Override
    public String toString() {
        return "stack: " + list.toString();
    }

    // main
    public static void main(String[] args) {
        GenericStack<String> stack1 = new GenericStack<>();
        stack1.push("重庆");
        stack1.push("北京");
        stack1.push("天津");
        stack1.push("上海");
        System.out.println(stack1);
        System.out.println(stack1.getSize());
        System.out.println(stack1.pop());
        System.out.println(stack1.isEmpty());
        while (stack1.getSize() > 0) {
            stack1.pop();
        }
        System.out.println(stack1.isEmpty());
    }
}
